package org.g4studio.core.mvc.xstruts.config;

/**
 * <p>
 * The collection of static configuration information that describes a
 * Struts-based module. Multiple modules are identified by a <em>prefix</em> at
 * the beginning of the context relative portion of the request URI. If no
 * module prefix can be matched, the default configuration (with a prefix equal
 * to a zero-length string) is selected, which is elegantly backwards compatible
 * with the previous Struts behavior that only supported one module.
 * </p>
 * 
 * @version $Rev: 421119 $ $Date: 2005-08-06 04:12:10 -0400 (Sat, 06 Aug 2005) $
 * @since Struts 1.1
 */
public interface ModuleConfig {
	/**
	 * <p>
	 * Has this module been completely configured yet. Once this flag has been
	 * set, any attempt to modify the configuration will return an
	 * IllegalStateException.
	 * </p>
	 */
	boolean getConfigured();

	/**
	 * <p>
	 * The controller configuration object for this module.
	 * </p>
	 */
	ControllerConfig getControllerConfig();

	/**
	 * <p>
	 * The controller configuration object for this module.
	 * </p>
	 * 
	 * @param cc
	 *            The controller configuration object for this module.
	 */
	void setControllerConfig(ControllerConfig cc);

	/**
	 * <p>
	 * The prefix of the context-relative portion of the request URI, used to
	 * select this configuration versus others supported by the controller
	 * servlet. A configuration with a prefix of a zero-length String is the
	 * default configuration for this web module.
	 * </p>
	 */
	String getPrefix();

	/**
	 * <p>
	 * The prefix of the context-relative portion of the request URI, used to
	 * select this configuration versus others supported by the controller
	 * servlet. A configuration with a prefix of a zero-length String is the
	 * default configuration for this web module.
	 * </p>
	 * 
	 * @param prefix
	 *            The prefix of the context-relative portion of the request URI.
	 */
	public void setPrefix(String prefix);

	/**
	 * <p>
	 * The default class name to be used when creating action form bean
	 * instances.
	 * </p>
	 */
	String getActionFormBeanClass();

	/**
	 * <p>
	 * The default class name to be used when creating action form bean
	 * instances.
	 * </p>
	 * 
	 * @param actionFormBeanClass
	 *            default class name to be used when creating action form bean
	 *            instances.
	 */
	void setActionFormBeanClass(String actionFormBeanClass);

	/**
	 * <p>
	 * The default class name to be used when creating action mapping instances.
	 * </p>
	 */
	String getActionMappingClass();

	/**
	 * <p>
	 * The default class name to be used when creating action mapping instances.
	 * </p>
	 * 
	 * @param actionMappingClass
	 *            default class name to be used when creating action mapping
	 *            instances.
	 */
	void setActionMappingClass(String actionMappingClass);

	/**
	 * <p>
	 * Add a new <code>ActionConfig</code> instance to the set associated with
	 * this module.
	 * </p>
	 * 
	 * @param config
	 *            The new configuration instance to be added
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void addActionConfig(ActionConfig config);

	/**
	 * <p>
	 * Add a new <code>ExceptionConfig</code> instance to the set associated
	 * with this module.
	 * </p>
	 * 
	 * @param config
	 *            The new configuration instance to be added
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void addExceptionConfig(ExceptionConfig config);

	/**
	 * <p>
	 * Add a new <code>FormBeanConfig</code> instance to the set associated with
	 * this module.
	 * </p>
	 * 
	 * @param config
	 *            The new configuration instance to be added
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void addFormBeanConfig(FormBeanConfig config);

	/**
	 * <p>
	 * The default class name to be used when creating action forward instances.
	 * </p>
	 */
	String getActionForwardClass();

	/**
	 * <p>
	 * The default class name to be used when creating action forward instances.
	 * </p>
	 * 
	 * @param actionForwardClass
	 *            default class name to be used when creating action forward
	 *            instances.
	 */
	void setActionForwardClass(String actionForwardClass);

	/**
	 * <p>
	 * Add a new <code>ForwardConfig</code> instance to the set of global
	 * forwards associated with this module.
	 * </p>
	 * 
	 * @param config
	 *            The new configuration instance to be added
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void addForwardConfig(ForwardConfig config);

	/**
	 * <p>
	 * Add a new <code>MessageResourcesConfig</code> instance to the set
	 * associated with this module.
	 * </p>
	 * 
	 * @param config
	 *            The new configuration instance to be added
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void addMessageResourcesConfig(MessageResourcesConfig config);

	/**
	 * <p>
	 * Add a newly configured {@link PlugInConfig} instance to the set of
	 * plug-in Actions for this module.
	 * </p>
	 * 
	 * @param plugInConfig
	 *            The new configuration instance to be added
	 */
	void addPlugInConfig(PlugInConfig plugInConfig);

	/**
	 * <p>
	 * Return the action configuration for the specified path, if any; otherwise
	 * return <code>null</code>.
	 * </p>
	 * 
	 * @param path
	 *            Path of the action configuration to return
	 */
	ActionConfig findActionConfig(String path);

	/**
	 * <p>
	 * Return the action configurations for this module. If there are none, a
	 * zero-length array is returned.
	 * </p>
	 */
	ActionConfig[] findActionConfigs();

	/**
	 * <p>
	 * Return the exception configuration for the specified type, if any;
	 * otherwise return <code>null</code>.
	 * </p>
	 * 
	 * @param type
	 *            Exception class name to find a configuration for
	 */
	ExceptionConfig findExceptionConfig(String type);

	/**
	 * <p>
	 * Perform a recursive search for an ExceptionConfig registered for this
	 * class, or for any superclass. This should only be used in the case when
	 * an <code>ActionConfig</code> is not available; otherwise, use
	 * <code>ActionConfig.findException(Class)</code> to preserve the search
	 * order.
	 * </p>
	 * 
	 * @param type
	 *            Exception class name to find a configuration for
	 * @see ActionConfig findException(Class)
	 */
	ExceptionConfig findException(Class type);

	/**
	 * <p>
	 * Return the exception configurations for this module. If there are none, a
	 * zero-length array is returned.
	 * </p>
	 */
	ExceptionConfig[] findExceptionConfigs();

	/**
	 * <p>
	 * Return the form bean configuration for the specified key, if any;
	 * otherwise return <code>null</code>.
	 * 
	 * @param name
	 *            Name of the form bean configuration to return
	 */
	FormBeanConfig findFormBeanConfig(String name);

	/**
	 * <p>
	 * Return the form bean configurations for this module. If there are none, a
	 * zero-length array is returned.
	 * </p>
	 */
	FormBeanConfig[] findFormBeanConfigs();

	/**
	 * <p>
	 * Return the forward configuration for the specified key, if any; otherwise
	 * return <code>null</code>.
	 * </p>
	 * 
	 * @param name
	 *            Name of the forward configuration to return
	 */
	ForwardConfig findForwardConfig(String name);

	/**
	 * <p>
	 * Return the form bean configurations for this module. If there are none, a
	 * zero-length array is returned.
	 * </p>
	 */
	ForwardConfig[] findForwardConfigs();

	/**
	 * <p>
	 * Return the message resources configuration for the specified key, if any;
	 * otherwise return <code>null</code>.
	 * </p>
	 * 
	 * @param key
	 *            Key of the data source configuration to return
	 */
	MessageResourcesConfig findMessageResourcesConfig(String key);

	/**
	 * <p>
	 * Return the message resources configurations for this module. If there are
	 * none, a zero-length array is returned.
	 * </p>
	 */
	MessageResourcesConfig[] findMessageResourcesConfigs();

	/**
	 * <p>
	 * Return the configured plug-in actions for this module. If there are none,
	 * a zero-length array is returned.
	 * </p>
	 */
	PlugInConfig[] findPlugInConfigs();

	/**
	 * <p>
	 * Freeze the configuration of this module. After this method returns, any
	 * attempt to modify the configuration will return an IllegalStateException.
	 * </p>
	 */
	void freeze();

	/**
	 * <p>
	 * Remove the specified action configuration instance.
	 * </p>
	 * 
	 * @param config
	 *            ActionConfig instance to be removed
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void removeActionConfig(ActionConfig config);

	/**
	 * <p>
	 * Remove the specified exception configuration instance.
	 * </p>
	 * 
	 * @param config
	 *            ActionConfig instance to be removed
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void removeExceptionConfig(ExceptionConfig config);

	/**
	 * <p>
	 * Remove the specified form bean configuration instance.
	 * </p>
	 * 
	 * @param config
	 *            FormBeanConfig instance to be removed
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void removeFormBeanConfig(FormBeanConfig config);

	/**
	 * <p>
	 * Remove the specified forward configuration instance.
	 * </p>
	 * 
	 * @param config
	 *            ForwardConfig instance to be removed
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void removeForwardConfig(ForwardConfig config);

	/**
	 * <p>
	 * Remove the specified message resources configuration instance.
	 * </p>
	 * 
	 * @param config
	 *            MessageResourcesConfig instance to be removed
	 * @throws IllegalStateException
	 *             if this module configuration has been frozen
	 */
	void removeMessageResourcesConfig(MessageResourcesConfig config);
}
